﻿using System;
using System.Linq;
using GalaSoft.MvvmLight.Ioc;
using Tisbi.LawFirm.BL.Services;
using Tisbi.LawFirm.DAL.Models;

namespace Tisbi.LawFirm.BL
{
    public class SecurityContextSingleton
    {
        private static readonly SecurityContextSingleton ContextSingleton = new SecurityContextSingleton();
        public int CurentUserId { get; private set; }
        public Role CurentUserRole { get; private set; }
        public bool IsAuthenticated { get; private set; }
        public Employees CurrentEmploye { get; set; }

        private SecurityContextSingleton()
        {

        }

        public static SecurityContextSingleton GetInstance()
        {
            return ContextSingleton;
        }

        public bool IsAdministrator()
        {
            if (CurentUserRole == Role.Administrator) return true;
            Notifyer.NotifyError("Не достаточно прав. Вы должны быть администратором.",
                new Exception(string.Format("Пользователь {0} - {1} попытался выполнить несанкционированную операцию. Доступно только администраторам.",
                    CurrentEmploye.Id, CurrentEmploye.ShortFio)));
            return false;
        }

        public bool IsRootLawyer(bool showErrorMessage = true)
        {
            if (CurentUserRole == Role.RootLawyer || CurentUserRole == Role.Administrator) return true;
            if (showErrorMessage)
            {
                Notifyer.NotifyError("Не достаточно прав. Вы должны быть главным юристом.",
                    new Exception(
                        string.Format(
                            "Пользователь {0} - {1} попытался выполнить несанкционированную операцию. Доступно только главным юристом.",
                            CurrentEmploye.Id, CurrentEmploye.ShortFio)));
            }
            return false;
        }

        public void LogIn(string userName, string password)
        {
            var employees = SimpleIoc.Default.GetInstance<IEmployeesServiceAgent>();
            employees.GetItem((list, exception) =>
            {
                if (exception != null)
                {
                    Notifyer.NotifyError(exception.Message, exception);
                    IsAuthenticated = false;
                    return;
                }

                if (list.Count > 0)
                {
                    var user = list.FirstOrDefault(x => x.Login == userName && x.Password == password);
                    if (user == null)
                    {
                        Notifyer.NotifyError("Пользователь не найден", new Exception("Пользователь не найден"));
                        IsAuthenticated = false;
                        return;
                    }

                    CurentUserId = user.Id;
                    CurentUserRole = user.Role;
                    IsAuthenticated = true;
                    CurrentEmploye = user;

                    return;
                }

                employees.AddItem(new Employees
                {
                    Login = userName,
                    Password = password,
                    ShortFio = "Admin",
                    Role = Role.Administrator
                }, error =>
                {
                    if (error == null)
                    {
                        Notifyer.Notify("Создан новый пользователь с ролью администратор");
                        LogIn(userName, password);
                        return;
                    }

                    Notifyer.NotifyError("Не возможно создать нового пользователя", error);
                    IsAuthenticated = false;
                });
            });
        }
    }
}
